Autorelease Pool
@autoreleasepool结构
单个 autoreleasepool 的运行过程可以简单地理解为 objc_autoreleasePoolPush()、[对象 autorelease] 和 objc_autoreleasePoolPop(void *) 三个过程
1 | struct __AtAutoreleasePool { |
组成
每一个自动释放池都是由一系列的 AutoreleasePoolPage 组成的,并且每一个 AutoreleasePoolPage 的大小都是 4096 字节(16 进制 0x1000)
1 | class AutoreleasePoolPage { |
双向链表
自动释放池中的 AutoreleasePoolPage 是以双向链表的形式连接起来的
小结
- 自动释放池是由 AutoreleasePoolPage 以双向链表的方式实现的
- 当对象调用 autorelease 方法时,会将对象加入 AutoreleasePoolPage 的栈中
- 调用 AutoreleasePoolPage::pop 方法会向栈中的对象发送 release 消息
- 每个线程有一个Runloop 每个Runloop有一个Autorelease Pool
参考资料
什么时候释放
在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop (drain)
循环引用
- delegate
- Timer
- Block